前言:哎~關於polymorphism是什麼我花好幾天翻了課本不懂、估狗過也不懂、查Youtube也沒怎麼聽懂。
今天就來試著用白話文把他形容出來。
如同之前說到的物件導向概念是用來節省code行數,進而達到省時省力省眼睛防止肩膀酸痛的功效。
注:method是class裡面的function
注:因為C++是靜態語言,如果沒有class就沒有繼承,沒有inheritance也沒有polymorphism了喔*。
建議先讀過物件導向系列文章:
Pointer、Dynamic memory、物件導向系列文章(尤其是Inheritence)
今天聊的是Runtime\dynamic Polymorphism,在程式一邊跑的時候才知道下一步通往哪裡,有點像在走迷宮。事先沒有地圖,要到裡面之後才知道下一步通往哪裡。
假設一家人都會跳跟跑步,但高度跟速度不同。
例如:媽媽:跳70公分,跑步速度中等,爸爸跳60公分,跑步速度快,
簡單做出繼承:
先做出class跟兩個sub class。
class Family{
public:
void jump(){
cout << "Family average jump 50cm";
}
void run(){
cout <"Family average run fast";
}
};
class Mom:public Family{
public:
void jump(){
cout <<"Mom jumps 70cm";
}
void run(){
cout <<"run normal";
}
};
class Dad:public Family{
public:
void jump(){
cout <<"Dad jumps 60cm";
}
void run(){
cout <<"run fast";
}
};
當我們在呼叫時,會像下面這樣一行一行呼叫嘛:
Mom m;
Dad d;
m.jump();
m.run();
d.jump();
d.run();
因為class Mom和class Dad已經定義好各自的object m和objct d,所以會直接取用到class Mom跟class Dad的的method。
把之前一樣名字的function覆蓋掉,就是overriding。
如果我們事先不知道要叫誰的資料出來,例如給user選擇要看媽媽還是爸爸的資料,
那就必須把這個變成function(user的選擇);
這種會因為argument不同產生不同結果的情況叫做overloading。
啊因為是在程式執行時才知道的東西,這個方式稱為動態記憶體(請搭直通車Dynamic memory),所以要用到pointer。
Family f;
Mom m;
Dad d;
Family *f1 = &m; //把f1對準m的位址
Family *f2 = &d; //把f2對準d的位址
f1 -> setname("Sophia");
cout << m.getname() << endl;
更白話一點來說,f1裡面放的就是Mom的object m的記憶體地址。
所以可以在f1裡面操作放進m的名字。
下面這兩個寫法是一樣的意思
完整程式示範如何讓使用者輸入爸媽的名字:
#include <iostream>
using namespace std;
class Family{
protected:
string Name;
public:
void setname(string name){
Name = name;
}
string getname(){
return Name;
}
};
class Mom:public Family{
public:
string getname(){
return "Mom's name is " + Name;
}
};
class Dad:public Family{
public:
string getname(){
return "Dad's name is "+ Name;
}
};
int main()
{
string x, y;
Family f;
Mom m;
Dad d;
Family *f1 = &m;
Family *f2 = &d;
cout <<"Type mom's name: ";
cin >> x;
f1 -> setname(x);
cout <<"Type dad's name: ";
cin >> y;
f2 -> setname(y);
cout << m.getname() << endl;
cout << d.getname() << endl;
return 0;
}
昨天的文章第二個Hackerank題目Ingeritance的int main裡面有一個東西,也有用到pointer喔~
小總結,polymorphism的意思就是
引用自stackify.com
“It describes the concept that you can access objects of different types through the same interface.”
下一篇來聊聊virtuel function。
Reference: Practical C++ Programming, The Cherno, thenewboston, w3cschool, geeksforgeeks, cplusplus, programiz, CodeBeuty, https://www.udacity.com/blog/2021/07/understanding-polymorphism-in-cpp.html, freecodecamp